import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;


public class Editeur extends JPanel implements ActionListener , KeyListener{	
	
	private JTextArea texte;
	private JButton executer,annuler,effacer;
	private JPanel ZoneTexte;
	private Box ZoneBouton;	
	private boolean isModif = false;
	private JInternalFrame parent;
	private Bibliotheque biblio;
	
	public Editeur(JInternalFrame parent, Bibliotheque biblio) {    	
		super();
		this.parent=parent;
		this.biblio=biblio;
		this.setLayout(new BorderLayout());     		
		this.setBackground(Color.GRAY);
		
		executer = new JButton("Demarrer"); //on cree le bouton executer
		executer.addActionListener(this);    	
		annuler = new JButton("Arreter"); //on cree le bouton annuler
		annuler.setEnabled(false);
		annuler.addActionListener(this); 
		effacer = new JButton("Effacer");
		effacer.addActionListener(this);
		ZoneBouton = Box.createHorizontalBox(); //on identifie la box qui contient les boutons
		//ajout des boutons
		ZoneBouton.setBackground(Color.RED);    	 
		ZoneBouton.add(executer);    	
		ZoneBouton.add(annuler);
		ZoneBouton.add(effacer);
		ZoneBouton.add(Box.createRigidArea(new Dimension(30,0)));
		ZoneBouton.setVisible(true);    	    	    	
		
		ZoneTexte = new JPanel(new BorderLayout()); //on definit la zone de texte   
		texte = new JTextArea();
		texte.setLineWrap(true);  //retour � ligne automatique
		texte.setWrapStyleWord(true); //pour que les mots ne soient pas coup�s  
		texte.addKeyListener(this);		
		ZoneTexte.add(texte, BorderLayout.CENTER); //on cree la zone de texte
		nouveau();		
		this.add(ZoneBouton,BorderLayout.SOUTH); //on ajoute la zone des boutons dans l'editeur		
		this.add(new JScrollPane(ZoneTexte), BorderLayout.CENTER); //on ajoute la zone de texte dans l'editeur
	}
	
	public void nouveau() {texte.setText("");}
	
	public boolean isModif() {return isModif;}
	public void setModif(boolean modif) {isModif=modif;}
	
		
	public void ecrire(String fichier)
	{
		try {
			FileWriter fw = new FileWriter(fichier);
			BufferedWriter bw = new BufferedWriter (fw);
			PrintWriter fichierSortie = new PrintWriter (bw); 
			fichierSortie.println (texte.getText()); 
			fichierSortie.close();
			System.out.println("Le fichier '"+fichier+"' a �t� cr��!"); 
		}
		catch (IOException e){
			System.out.println(e.toString());
		}		
	}
	
	public void lecture(String fichier)
	{
		try{
			InputStream ips=new FileInputStream(fichier); 
			InputStreamReader ipsr=new InputStreamReader(ips);
			BufferedReader br=new BufferedReader(ipsr);
			String ligne;
			while ((ligne=br.readLine())!=null)
			{
				texte.append(ligne+"\n");
			}
			br.close(); 
		}		
		catch (Exception e){
			System.out.println(e.toString());
		}    	
	}
	
	//effacer l'editeur
	public void effacerEditeur(){
		texte.setText("");
	}
	
	//ajout accesseur JTextArea
    public JTextArea getJTexteArea()
    {
    	return texte;
    } 
    
    //accesseur JButton executer
    public JButton getJButtonExecuter()
    {
    	return executer;
    }
 
    //accesseur JButton annuler
    public JButton getJButtonAnnuler()
    {
    	return annuler;
    }
 	
    
    
	public void actionPerformed(ActionEvent e) 
	{
		if (e.getSource() == executer)
		{
			executer.setEnabled(false); //desactiver bouton executer			
			annuler.setEnabled(true); //activer bouton annuler
			//ecrire("aParser.logo"); //ecriture de ce qu'on recupere dans la zone de texte
			texte.setEditable(false);

			ArrayList<Object> instruction = new ArrayList<Object>();
	    	ByteArrayInputStream stream  = new ByteArrayInputStream(texte.getText() .getBytes());	    	
	    	Trans parser = new Trans(stream);
	    	parser.initBibliotheque(biblio);
	    	Evaluation E = new Evaluation();
	    	E.initEnv(new HashMap<String, Object>());
	    	
	    		try {
					instruction = parser.run();
				} catch (ParseException e1) {
					e1.printStackTrace();
				} catch (Exception e1) {
					e1.printStackTrace();
				}
	    		System.out.println("instruction : " + instruction);
	        	try {
					E.evalListe(instruction);
				} catch (IllegalArgumentException e1) {
					e1.printStackTrace();
				} catch (IllegalAccessException e1) {
					e1.printStackTrace();
				} catch (InvocationTargetException e1) {
					e1.printStackTrace();
				}
		}
			
		
			
		if (e.getSource() == annuler )
		{
			executer.setEnabled(true); //desactiver bouton executer			
			annuler.setEnabled(false); //activer bouton annuler
			texte.setEditable(true);
		}
		
		if(e.getSource() == effacer)
			effacerEditeur();
	}
	
	
	public void keyTyped(KeyEvent arg0) {
		if (!isModif)
		{
			isModif=true;
			parent.setTitle(parent.getTitle()+"*");
		}
		
	}
	public void keyPressed(KeyEvent arg0) {}
	public void keyReleased(KeyEvent arg0) {}   
	
	
}
